package functional.currying;

/**
 * @ClassName CurryingAndPartials
 * @PackageName functional.currying
 * @projectName myThread
 * @Description 
 * @Author games
 * @Date 2025/8/27 下午2:48
 * @Version 1.0
 */

import java.util.function.*;

public class CurryingAndPartials {
    // 未柯里化:
    static String uncurried(String a, String b) {
        return a + b;
    }

    public static void main(String[] args) {
        /**
         * 柯里化函数示例
         * 定义一个柯里化的字符串连接函数，接受两个字符串参数并返回它们的连接结果
         * @param <String> 第一个字符串参数类型
         * @param <String> 第二个字符串参数类型
         * @param <String> 返回的字符串结果类型
         * @return 返回一个函数，该函数接受第一个字符串，返回另一个接受第二个字符串并返回连接结果的函数
         */
        // 柯里化的函数:
        Function<String, Function<String, String>> sum =
                a -> b -> a + b; // [1]

        System.out.println(uncurried("Hi ", "Ho"));

        // 创建部分应用函数，固定第一个参数为"Hi "
        Function<String, String>
                hi = sum.apply("Hi "); // [2]
        System.out.println(hi.apply("Ho"));

        // 部分应用示例:
        // 创建一个新的函数sumHi，它已经绑定了第一个参数"Hup "
        // 这个新函数可以被多次调用，每次只需要提供第二个参数
        Function<String, String> sumHi =
                sum.apply("Hup ");
        System.out.println(sumHi.apply("Ho"));
        System.out.println(sumHi.apply("Hey"));

    }
}